package com.spring.framework.aop.annotation.point;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * 1. 切面类，专门用于存放切入点定义
 * <p>
 * 注解 @Pointcut 标注在一个切面类的方法上，该方法名就是该切入点的名字，然后可以在通知中通过名字引用该切入点（要带括号），也可以将多个切入点通
 * 过名字引用使用&&、||、!组合起来成为一个新的切入点，这是基于XML的配置所不具备的功能。
 * <p>
 * 另外，在处理企业应用程序时，为了更加模块化，通常可以将所有的切入点定义在一个切面类中，该类专门用于存放切入点，其他切面类用于存放通知，切入点在
 * 所有切面类中是共享的！
 *
 * @author xuweizhi
 */
@Aspect
@Component
public class AspectPointcut {

	/**
	 * 任何方法的切入点
	 */
	@Pointcut("execution(* *(..))")
	public void pointcut1() {
	}

	/**
	 * AspectPointcutTarget类的target1方法的切入点
	 */
	@Pointcut("execution(* *..AspectPointcutTarget.target1(..))")
	public void pointcut2() {
	}

	/**
	 * AspectPointcutTarget类的任何方法的切入点
	 */
	@Pointcut("within(*..AspectPointcutTarget)")
	public void pointcut3() {
	}

	/**
	 * 第一个参数是String类型的任何方法的切入点
	 */
	@Pointcut("args(String,..)")
	public void pointcut4() {
	}

	/**
	 * 通过切入点名称组合切入点
	 * <p>
	 * AspectPointcutTarget类的第一个参数是String类型的任何方法的切入点
	 */
	@Pointcut("pointcut3() && pointcut4()")
	public void pointcut5() {
	}

}
